iOS MachineLearning 系列(4)—— 静态图像分析之物体识别与分类
iOS MachineLearning 系列(4)—— 静态图像分析之物体识别与分类
本系列的前几篇文件,详细了介绍了Vision框架中关于静态图片区域识别的内容。本篇文章,我们将着重介绍静态图片中物体的识别与分类。物体识别和分类也是Machine Learning领域重要的应用。通过大量的图片数据进行训练后,模型可以轻易的分析出图片的属性以及图片中物体的属性。
1 - 文字识别
文字识别是应用非常广泛的一种图片识别技术。在Vision框架中,使用VNRecognizeTextRequest来进行文字识别,并且其支持多种语言,且有不错的识别精度。VNRecognizeTextRequest的创建示例如下:
1 | private lazy var recognizeTextRequest: VNRecognizeTextRequest = { |
可以通过对VNRecognizeTextRequest实例进行配置来调整识别精度,识别的语言,是否进行矫正的选项,VNRecognizeTextRequest类的定义如下:
1 | open class VNRecognizeTextRequest : VNImageBasedRequest, VNRequestProgressProviding { |
VNRecognizeTextRequest的识别结果为VNRecognizedTextObservation类,此类也是继承自VNRectangleObservation的,因此我们也同时可以获取到所识别的文本所在原图的位置。VNRecognizedTextObservation类的定义如下:
1 | open class VNRecognizedTextObservation : VNRectangleObservation { |
topCandidate会返回一组候选结果,其参数设置最多返回的候选结果个数,需要注意此参数所支持的最大值为10。候选结果是指对于同一段文字,可能会识别出多个相似的结果,最终识别的文本结果VNRecognizedText类的定义如下:
1 | open class VNRecognizedText : NSObject, NSCopying, NSSecureCoding, VNRequestRevisionProviding { |
对于confidence可信度属性来说,越接近1,可信度越高。
下图演示了照片中文本的识别效果:
可以看到,Vision对于中文印刷体的识别能力还是比较准确的。
目前,所支持识别的语种列举如下:
1 | en-US:美式英语 |
2 - 动物识别
虽说是动物识别,但其实目前的API仅仅支持猫和狗的识别。使用VNRecognizeAnimalsRequest类来创建动物识别请求:
1 | open class VNRecognizeAnimalsRequest : VNImageBasedRequest { |
识别的结果VNRecognizedObjectObservation类也是继承自VNDetectedObjectObservation,其会包装所识别的动物所在图片中的区域,且VNRecognizedObjectObservation类中会封装一组VNClassificationObservation对象,如下:
1 | open class VNRecognizedObjectObservation : VNDetectedObjectObservation { |
VNClassificationObservatio类即表示识别出的物体具体的标签,定义如下:
1 | open class VNClassificationObservation : VNObservation { |
对于VNRecognizeAnimalsRequest请求来说,此标签的值可能为Cat或Dog。识别效果如下图:
3 - 图片物体分类
图片物体分类是指对静态图片继续分析,将其中可能存在的物体分析出来。使用VNClassifyImageRequest创建图片物体分析请求。此类非常简单,没有太多需要配置的,定义如下:
1 | open class VNClassifyImageRequest : VNImageBasedRequest { |
VNClassifyImageRequest所支持识别的物体种类非常多,有千余种,这里就不再列举。其识别后的结果也是VNClassificationObservation类,其内部的identifier表示所识别出的物体的标签。
需要注意,对于略微复杂的图片来说,识别的结果可能非常多,我们需要根据需求来设置一个可信度的阈值,只有达到此可信度的才被采用,例如:
1 | private func drawTask(request: VNClassifyImageRequest) { |
识别效果如下图所示:
可以看到,我们选择了大于0.8可信度的结果,所识别出的关键字有:建筑,加工木材,动物,哺乳动物,犬类,狗,博美。(不知为何对猫的识别度很差)
本中所涉及到的代码,都可以在如下 Demo 中找到:
https://github.com/ZYHshao/MachineLearnDemo
到此,我们已经将静态图片的分析做了详尽的介绍,相信很多AI能力都是开发中会使用到的。本系列后面文章,将介绍对象追踪的相关API的用法。